package 创建型模式.单例模式;

import 创建型模式.单例模式.双检锁.DoubleCheckedLocking;
import 创建型模式.单例模式.懒汉模式.LazyModel;
import 创建型模式.单例模式.枚举模式.EnumModel;
import 创建型模式.单例模式.静态内部类.StaticInnerClass;
import 创建型模式.单例模式.饿汉模式.HungerModel;

/**
 * @author 康米
 * {@code @date} 2023/1/31  17:19
 */
public class Test {
    public static void main(String[] args) {

        //单例模式
        //主要目的是创建一个全局唯一对象，防止该对象被多次实例化
        //实际用途：减少了内存的开销，避免了资源的浪费，
        //不足：与单一职责原则冲突，即一个类应该只关心内部逻辑，而不关心外面怎么来实例化。


        //饿汉模式
        //优点：1.线程安全。2.没有加锁因此效率高
        //缺点：类加载时就初始化，浪费了内存
        HungerModel hungerModel = HungerModel.getInstance();
        hungerModel.show();

        //懒汉模式
        //优点：1.线程安全（加锁的情况下）。2.懒加载，因此避免了内存的浪费
        //缺陷：加锁影响了性能
        LazyModel lazyModel = LazyModel.getInstance();
        lazyModel.show();

        //双检锁模式
        //优点：实现了懒加载，且在多线程下保持高性能
        //缺陷：写法复杂
        DoubleCheckedLocking doubleCheckedLocking = DoubleCheckedLocking.getInstance();
        doubleCheckedLocking.show();

        //静态内部类
        //优点：实现了懒加载，且线程安全
        StaticInnerClass staticInnerClass = StaticInnerClass.getInstance();
        staticInnerClass.show();

        //枚举模式
        //实现单例模式的最佳方法
        //优点：1.自动支持序列化机制 2.绝对防止多次实例化 3.线程安全 4.简洁
        //缺点：没有实现懒加载
        EnumModel.ENUM_MODEL.show();
    }
}
